package com.vainycos.lotterysearch.service.mail;

import lombok.Builder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import java.io.File;
import java.util.List;
import java.util.Objects;

/**
 * @author: Vainycos
 * @description 邮件服务提供默认实现
 */
@Builder
@Slf4j
public class JavaMailSupport {

    /**
     * 处理复杂邮件
     * @param mimeMessageHelper
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param toWho 收件人
     * @param ccPeoples 抄送人
     * @param bccPeoples 密抄送人
     * @param isHtml 是否支持html
     * @return
     */
    public void handleBasicInfo(MimeMessageHelper mimeMessageHelper, String subject, String content, String[] toWho, List<String> ccPeoples, List<String> bccPeoples, boolean isHtml, String from) throws MessagingException {
        //设置发件人
        mimeMessageHelper.setFrom(from);
        //设置邮件的主题
        mimeMessageHelper.setSubject(subject);
        //设置邮件的内容，区别是否是HTML邮件
        mimeMessageHelper.setText(content, isHtml);
        //设置邮件的收件人
        mimeMessageHelper.setTo(toWho);
        //设置非必要的邮件元素，在使用helper进行封装时，这些数据都不能够为空
        if(ccPeoples != null) {
            //设置邮件的抄送人：MimeMessageHelper # Assert.notNull(cc, "Cc address array must not be null");
            mimeMessageHelper.setCc(ccPeoples.stream().toArray(String[]::new));
        }
        if(bccPeoples != null) {
            //设置邮件的密送人：MimeMessageHelper # Assert.notNull(bcc, "Bcc address array must not be null");
            mimeMessageHelper.setBcc(bccPeoples.stream().toArray(String[]::new));
        }
    }

    /**
     * 处理简单邮件
     * @param simpleMailMessage 简单邮件信息对象
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param toWho 收件人
     * @param ccPeoples 抄送人
     * @param bccPeoples 密抄送人
     * @param from 发件人
     */
    public void handleBasicInfo(SimpleMailMessage simpleMailMessage, String subject, String content, String[] toWho, List<String> ccPeoples, List<String> bccPeoples, String from){
        // 设置发件人
        simpleMailMessage.setFrom(from);
        // 设置邮件的主题
        simpleMailMessage.setSubject(subject);
        // 设置邮件的内容
        simpleMailMessage.setText(content);
        // 设置邮件的收件人
        simpleMailMessage.setTo(toWho);
        // 设置邮件的抄送人
        if (Objects.nonNull(ccPeoples) && ccPeoples.size() > 0){
            simpleMailMessage.setCc(ccPeoples.stream().toArray(String[]::new));
        }
        // 设置邮件的密送人
        if (Objects.nonNull(bccPeoples) && bccPeoples.size() > 0){
            simpleMailMessage.setBcc(bccPeoples.stream().toArray(String[]::new));
        }

    }

    /**
     * 处理邮件文件
     * @param mimeMessageHelper 复杂邮件
     * @param subject 邮件主题
     * @param attachmentFilePaths 文件内容
     */
    public void handleAttachment(MimeMessageHelper mimeMessageHelper, String subject, List<String> attachmentFilePaths){
        // 判断是否需要处理邮件的附件
        if(attachmentFilePaths != null && attachmentFilePaths.size() > 0) {
            FileSystemResource resource;
            String fileName;
            // 循环处理邮件的附件
            for (String attachmentFilePath : attachmentFilePaths) {
                // 获取该路径所对应的文件资源对象
                resource = new FileSystemResource(new File(attachmentFilePath));
                // 判断该资源是否存在，当不存在时仅仅会打印一条警告日志，不会中断处理程序。
                // 也就是说在附件出现异常的情况下，邮件是可以正常发送的，所以请确定你发送的邮件附件在本机存在
                if (!resource.exists()) {
                    log.warn("邮件->{} 的附件->{} 不存在！", subject, attachmentFilePath);
                    // 开启下一个资源的处理
                    continue;
                }
                // 获取资源的名称
                fileName = resource.getFilename();
                try {
                    // 添加附件
                    mimeMessageHelper.addAttachment(fileName, resource);
                } catch (MessagingException e) {
                    log.error("邮件->{} 添加附件->{} 出现异常", subject, attachmentFilePath);
                    log.error("异常信息：", e);
                }
            }
        }
    }

    /**
     * 处理邮件文件
     * @param mimeMessageHelper 复杂邮件
     * @param subject 邮件主题
     * @param attachmentFilePaths 文件
     */
    public void handleFileAttachment(MimeMessageHelper mimeMessageHelper, String subject, List<File> attachmentFilePaths){
        if (Objects.nonNull(attachmentFilePaths) && attachmentFilePaths.size() > 0){
            FileSystemResource resource;
            String fileName;
            // 循环处理邮件的附件
            for (File attachmentFilePath : attachmentFilePaths) {
                // 获取该路径所对应的文件资源对象
                resource = new FileSystemResource(attachmentFilePath);
                // 判断该资源是否存在，当不存在时仅仅会打印一条警告日志，不会中断处理程序。
                // 也就是说在附件出现异常的情况下，邮件是可以正常发送的，所以请确定你发送的邮件附件在本机存在
                if (!resource.exists()) {
                    log.warn("邮件->{} 的附件->{} 不存在！", subject, attachmentFilePath);
                    // 开启下一个资源的处理
                    continue;
                }
                // 获取资源的名称
                fileName = resource.getFilename();
                try {
                    // 添加附件
                    mimeMessageHelper.addAttachment(fileName, resource);
                } catch (MessagingException e) {
                    log.error("邮件->{} 添加附件->{} 出现异常", subject, attachmentFilePath);
                    log.error("异常信息：", e);
                }
            }
        }
    }
}
